<?

class UploadException extends Exception {
    public function __construct($exceptionMessage, $errorCode = 0) {
        parent::__construct($exceptionMessage, $errorCode);
    }
}

class modelo_upload {

	/*
	 * Ordem de uso:
	 *



		if($up->recebeuUpload()) {
			// upload recebido sem falha (com ou sem arquivo);
			if($up->ocorreuErroUpload()) {
				// dentre os erros, pode ser que o usuário não tenha selecionado o arquivo.
				if($up->codigoErroUpload() == 4) {
					// o usuário não selecionou o arquivo.
				}else{
					// ocorreu erro ao salvar o arquivo no servidor.
					$upload_error = true;
				}
			}
		}else{
			$upload_error = true;
		}


	 */

	protected $nome_campo_arquivo = NULL;

	public function __construct($nome_campo_arquivo = NULL) 
        {
            $this->setNomeCampoArquivo($nome_campo_arquivo);
	}
	
	public function setNomeCampoArquivo($nome) {
		$this->nome_campo_arquivo = $nome;
	}
	public function recebeuUpload() {
		// retorna true caso a variavel $_FILES possua arquivos:
		return !empty($_FILES);
	}
	public function recebeuUploadComCampoArquivoVazio() {
		// retorna true caso a variavel $_FILES possua arquivos:
		return $this->recebeuUpload() && $this->campoArquivoEmBranco();
	}
	public function ocorreuErroUpload() {
		return $_FILES[$this->nome_campo_arquivo]['error'] != 0;
	}
	public function codigoErroUpload() {
		return $_FILES[$this->nome_campo_arquivo]['error'];
	}
	public function mensagemErroUpload() {
		return $this->errorMessage($this->codigoErroUpload());
	}
	public function campoArquivoComArquivo() {
		return $_FILES[$this->nome_campo_arquivo]['error'] != 4;
	}
	public function tipoArquivo() {
		return $_FILES[$this->nome_campo_arquivo]['type'];
	}
	public function nomeArquivo() {
		return $_FILES[$this->nome_campo_arquivo]['name'];
	}
	public function extensaoArquivo($lowercase = true) {
		// retorna só a extensão sem o ponto antes da extensão.
		ereg("\.([^\.]+)$", $this->nomeArquivo(), $reg);
		if($lowercase) {
                    return strtolower($reg[1]);
		}
		return $reg[1];
	}
	public function nomeArquivoTemporario() {
		return $_FILES[$this->nome_campo_arquivo]['tmp_name'];
	}
	public function tamanhoArquivo($formato = NULL) {
		// formatos aceitos: bytes e kbytes
		// retorna um número com precisão de 2 casas decimais, ex:
		// 2.14 MB, 15.55 KB

		if($formato == NULL) {
			// retorna em MB:
			return round((int)$_FILES[$this->nome_campo_arquivo]['size'] / 1024 / 1024, 2) . ' MB';
		}else{
			if(!ereg("^(bytes|kbytes)$", $formato)) {
				throw new UploadException("Erro Upload: formato só aceita NULL, bytes ou kbytes.", 0);
			}
			if($formato == 'bytes') {
				return round((int)$_FILES[$this->nome_campo_arquivo]['size'], 2) . ' Bytes';
			}
			if($formato == 'kbytes') {
				return round((int)$_FILES[$this->nome_campo_arquivo]['size'] / 1024, 2) . ' KB';
			}
		}
	}


	public function moveUpload($dir, $nome_arquivo = NULL) {
		// $dir formato: exemplo/pasta/

		if($nome_arquivo == NULL) {
			$nome_arquivo = $this->nomeArquivo();
		}

		if(!move_uploaded_file($this->nomeArquivoTemporario(), $dir . $nome_arquivo)) {
			throw new UploadException("Erro Upload: falha move_uploaded_file('
			". $this->nomeArquivoTemporario() ."', '" . $dir . $nome_arquivo . "');", 0);
		}
	}

	private function errorMessage($error_code) {
		switch ($error_code) {
			case UPLOAD_ERR_INI_SIZE:
				return 'The uploaded file exceeds the upload_max_filesize';

			case UPLOAD_ERR_FORM_SIZE:
				return 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form';

			case UPLOAD_ERR_PARTIAL:
				return 'The uploaded file was only partially uploaded';

			case UPLOAD_ERR_NO_FILE:
				return 'No file was uploaded';

			case UPLOAD_ERR_NO_TMP_DIR:
				return 'Missing a temporary folder';

			case UPLOAD_ERR_CANT_WRITE:
				return 'Failed to write file to disk';

			case UPLOAD_ERR_EXTENSION:
				return 'File upload stopped by extension';

			default:
				return 'Unknown upload error (número: ' . $error_code . ')';
		}
	}
}

?>